home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swags_z.zip / SCREEN.SWG / 0071_VGA Palette Setting!.pas < prev    next >
Pascal/Delphi Source File  |  1994-08-25  |  3KB  |  123 lines

  1. {
  2. From: mysticm@ephsa.sat.tx.us (Eric Miller)
  3.  
  4. > first everything seemed to work out fine. Then I noticed that only
  5. > palettes 0 (black) to 8 (white) changed OUTCLUDING palette 7 (brown).
  6. > Colors beyond 8 (-> 15) didn't change.
  7. >  So where's the problem? Have I understood something wrong?
  8. >  All help will be _grrrrreatly_ appreciated!!!!
  9.  
  10.   No, you're just uninformed.  On VGA+ cards, you have to
  11. 256 palette entries.  In 16 color text mode, the first sixteen
  12. of these entries aren't mapped to the 16 attributes like you
  13. would expect.  The latter half are mapped down aways,
  14. attribute 15 being palette 63, for example.  I wonder if this
  15. is some offset from EGA days...looks like it.
  16.  
  17.  Anyways, here is some code to help...you have to get a
  18. table from the video bios that gives you the 16 palette numbers
  19. for the text attributes, and the palette number for the border color.
  20. }
  21. PROGRAM Text_Fade;
  22. {$G+ , $N+ }
  23. Uses Crt, Dos;
  24.  
  25. TYPE
  26.   TDacTable = array[0..16] of Byte;
  27.   { 0..15 - dac registers for text palette }
  28.   {    16 - border register ?              }
  29.  
  30. VAR
  31.   DacTable: TDacTable;
  32.   CRTAddress, StatusReg: word;
  33.  
  34. PROCEDURE InitDAC(VAR T: TDacTable);
  35. VAR
  36.   Regs: Registers;
  37. BEGIN
  38.   Regs.AX := $1009;
  39.   Intr($10, Regs);
  40.   T := TDacTable(Ptr(Regs.ES, Regs.DX)^);
  41. END;
  42.  
  43. PROCEDURE waitvsync; assembler;
  44. ASM
  45.   MOV DX,StatusReg
  46.  
  47.     @WaitNotVSyncLoop:
  48.     in   al,dx
  49.     and  al,8
  50.     jnz  @WaitNotVSyncLoop
  51.   @WaitVSyncLoop:
  52.     in   al,dx
  53.     and  al,8
  54.     jz   @WaitVSyncLoop
  55. end;
  56.  
  57. PROCEDURE SetTextColor(C, R, G, B: Byte;
  58.                        T: TDacTable);
  59. BEGIN
  60.   C := DacTable[C];
  61.   ASM
  62.     MOV DX, 968
  63.     MOV AL, C
  64.     OUT DX, AL
  65.     INC DX
  66.     MOV AL, R
  67.     OUT DX, AL
  68.     MOV AL, G
  69.     OUT DX, AL
  70.     MOV AL, B
  71.     OUT DX, AL
  72.   END;
  73. END;
  74.  
  75.  
  76. PROCEDURE SetVGA3(C, R, G, B: Byte);
  77. BEGIN
  78.   C := DacTable[C];
  79.   Port[968] := C;
  80.   Port[969]  := R; Port[969] := G; Port[969] := B;
  81. END;
  82.  
  83. VAR V, C: byte;
  84.  
  85.      
  86.  
  87. BEGIN
  88.  
  89.  IF ODD(port[$3CC])
  90.   THEN CRTAddress:=$3D4
  91.   ELSE CRTAddress:=$3B4;
  92.  StatusReg:=CRTAddress+6;
  93.  
  94.  InitDac(DacTable);
  95.  TextAttr := $07;
  96.  ClrScr;
  97.  
  98.  TextAttr := $17;
  99.  Writeln('Funky VGA palette setting, dood!');
  100.  TextAttr := $71;
  101.  Writeln('Funky VGA palette setting, dood!');
  102.  
  103.  WHILE NOT Keypressed DO
  104.  BEGIN
  105.  FOR V := 63 DOWNTO 0 DO
  106.    BEGIN
  107.      SetTextColor(1, V, 63-V, V, DacTable);
  108.      SetTextColor(7, 63-V, V, 63-V, DacTable);
  109.      IF V MOD 2 = 0 THEN waitvsync;
  110.    END;
  111.  FOR V := 0 TO 63 DO
  112.    BEGIN
  113.      SetVGA3(1, V, 63-V, V);
  114.      SetVGA3(7, 63-V, V, 63-V);
  115.      IF V MOD 2 = 0 THEN waitvsync;
  116.    END;
  117.  end;
  118.  
  119.  WHILE Readkey <> #13 DO;
  120.   textmode(lastmode);
  121. END.
  122.  
  123.